<?php

class Validator
{

  public static function getValidator($validatorName, $value, $arg1="", $arg2="")
  {
    switch ($validatorName)
    {
      default;
        return false;
        break;
      case 'array';
        return self::arrayVerif($value);
        break;
      case 'email';
        return self::email($value);
        break;
      case 'numTelFr';
        return self::numTelFr($value);
        break;
      case 'entier';
        return self::entier($value, $arg1, $arg2);
        break;
      case 'int';
        return self::entier($value, $arg1, $arg2);
        break;
      case 'tinyint';
        return self::entier($value, $arg1, $arg2);
        break;
      case 'decimal';
        return self::float($value, $arg1, $arg2);
        break;
      case 'float';
        return self::float($value, $arg1, $arg2);
        break;
      case 'text';
        return self::chaine($value, $arg1, $arg2);
        break;
      case 'timestamp';
        return self::entier($value, $arg1, $arg2);
        break;
      case 'chaine';
        return self::chaine($value, $arg1, $arg2);
        break;
      case 'varchar';
        return self::chaine($value, $arg1, $arg2);
        break;
      case 'checkDateFr';
        return self::checkDateFr($value, $arg1);
        break;
      case 'checkDateUs';
        return self::checkDateUs($value, $arg1);
        break;
      case 'dateTime';
        return self::dateTime($value);
        break;
      case 'datetime';
        return self::dateTime($value);
        break;
      case 'url';
        return self::url($value);
        break;
    }
  }

  /**
   * Verif::email()
   * Vérification syntaxique de l'adresse email
   *
   * @param mixed $adresse
   * @return
   */
  public static function email($adresse)
  {
    if (filter_var($adresse, FILTER_VALIDATE_EMAIL))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  public static function arrayVerif($value)
  {
    if (is_array($value))
      return true;
    else
      return false;
  }

  /**
   * Verif::numTelFr()
   * Vérification du numéro de telephone
   *
   * @param int $numero
   * @return
   */
  public static function numTelFr($numero)
  {

    if (!preg_match("#0\d{8,9}#", $numero))
    {
      return false;
    }
    else
    {
      return true;
    }
  }


  public static function float($value)
  {
    if(is_float($value))
    {
      return true;
    }
    return false;
  }

  /**
   * Verif::entier()
   * on vérifie si la valeur passé en parametre est un entier. Possibilité de préciser une valeur minimum et maximum.
   *
   * @param int $chiffre
   * @param int $minValue
   * @param int $maxValue
   * @return
   */
  public static function entier($chiffre, $minValue="", $maxValue="")
  {
    $errors = 0;
    //Le is_int buguait, modif trouvée sur http://fr3.php.net/manual/fr/function.is-int.php
    if (ctype_digit(strval($chiffre)))
    {
      if ($minValue)
      {
        if ($chiffre < $minValue)
        {
          $errors = 1;
        }
      }
      if ($maxValue)
      {
        if ($chiffre > $maxValue)
        {
          $errors = 1;
        }
      }
    }
    else
    {
      $errors = 1;
    }

    if ($errors == 0)
      return true;

    return false;
  }

  /**
   * Verif::chaine()
   * on vérifie si la valeur passé en parametre est une chaine de caractere. Possibilité de préciser une longueur minimum et maximum.
   *
   * @param mixed $chaine
   * @param int $minLen
   * @param int $maxLen
   * @return
   */
  public static function chaine($chaine, $minLen="", $maxLen="")
  {
    $errors = 0;

    if (is_string($chaine))
    {

      if ($minLen != "" && strlen(trim($chaine)) < $minLen)
      {
        $errors = 1;
      }

      if ($maxLen != "" && strlen(trim($chaine)) > $maxLen)
      {
        $errors = 1;
      }
    }

    if ($errors == 0)
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  /**
   * Verif::checkDateFr()
   * on vérifie si la date FR passé en parametre (format d-m-Y) est une date valide.
   * Il faut également passer en parametre le type de séparateur.
   *
   * @param date $dateFr
   * @param mixed $sepIn
   * @return
   */
  public static function checkDateFr($dateFr, $sepIn)
  {
    $d1 = explode($sepIn, $dateFr);
    if (checkdate($d1[1], $d1[0], $d1[2]))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  /**
   * Verif::checkDateUs()
   * on vérifie si la date US passé en parametre (format Y-m-d) est une date valide.
   * Il faut également passer en parametre le type de séparateur.
   *
   * @param date $dateUs
   * @param mixed $sepIn
   * @return
   */
  public static function checkDateUs($dateUs, $sepIn)
  {
    $d1 = explode($sepIn, $dateUs);
    if (checkdate($d1[1], $d1[2], $d1[0]))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  /**
   * Verif::datetime()
   *
   * Vérifie si il s'agit bien d'un datetime
   *
   * @param mixed $datetime
   * @return
   */
  public static function dateTime($datetime)
  {
    list($date, $time) = explode(' ', $datetime);
    $tableauDate = explode('-', $date);
    $tableauTime = explode(':', $time);
    if (checkdate($tableauDate[1], $tableauDate[2], $tableauDate[0]))
    {
      if (($tableauTime[0] < 24) && ($tableauTime[1] < 60) && ($tableauTime[2] < 60))
      {
        return true;
      }
      else
      {
        return false;
      }
    }
    else
    {
      return false;
    }
  }

  /**
   * Verif::datetime()
   *
   * Vérifie si il s'agit bien d'un datetime
   *
   * @param mixed $datetime
   * @return
   */
  public static function url($url)
  {
    $Syntaxe = '#^http:\/\/[\.0-9\w]+.*#';

    if (preg_match($Syntaxe, $url))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

}

?>
